


// function Dog(params)
// {
//     this.Name = params.NameP;
//     this.Age = params.ageQ;
//     this.Weight = params.w;
//     this.print = function(){
//         console.log("dog " + this.Name + "'s weight is " + this.Weight); 
//     }
//     //return this; //有无这句都可正常输出。它是多余的。
//     // new表达式构建、传入（给构造函数使用）、返回this（做为new表达式的返回值），构造函数自己的返回值没作用、多余。
//     //return "this is what"; //这句有无也没产生任何可见的影响。
// }
//
// let dogObj = new Dog({NameP:"dog1", ageQ:3, w:5});
// console.log(dogObj);
// dogObj.print(); // dog dog1's weight is 5


// // 根据插件提示，es2015标准中对应的构造函数，可经上面的形式转为如下语法格式，执行效果相同：
// class Dog {
//     constructor(params) {
//         this.Name = params.NameP;
//         this.Age = params.ageQ;
//         this.Weight = params.w;
//         this.print = function () {
//             console.log("dog " + this.Name + "'s weight is " + this.Weight);
//         };
//         //return this; //有无这句都可正常输出。它是多余的。
//         // new表达式构建、传入（给构造函数使用）、返回this（做为new表达式的返回值），构造函数自己的返回值没作用、多余。
//         //return "this is what"; //这句有无也没产生任何可见的影响。
//     }
// }
//
// let dogObj = new Dog({NameP:"dog1", ageQ:3, w:5});
// console.log(dogObj);
// dogObj.print(); // dog dog1's weight is 5


// //测试new关键字不使用的结果
// function Dog(params)
// {
//     this.Name = params.NameP;
//     this.Age = params.ageQ;
//     this.Weight = params.w;
//     this.print = function(){
//         console.log("dog " + this.Name + "'s weight is " + this.Weight); 
//     }
//     //return this; //当这个例子中（去掉了new关键字），打开这个return，则正常输出，而不报错了。
//     // 但。。。逻辑是错的，，这里this指向了window对象。！！！
//     //return "this is what";
// }

// let dogObj = /*new*/ Dog({NameP:"dog1", ageQ:3, w:5});
// console.log(dogObj); 
// dogObj.print(); 
// //输出结果：
// // create_object.js:57 undefined
// // create_object.js:58 Uncaught TypeError: Cannot read properties of undefined (reading 'print')
// //     at create_object.js:58:8
// // (anonymous) @ create_object.js:58


// // 测试instanceof
// function Dog(params)
// {
//     this.Name = params.NameP;
//     this.Age = params.ageQ;
//     this.Weight = params.w;
//     this.print = function(){
//         console.log("dog " + this.Name + "'s weight is " + this.Weight); 
//     }
//     return this;
// }
// let dogObj1 = Dog({NameP:"dog1", ageQ:3, w:5});//有return时，Dog函数里的 this指向了当前的 window
// console.log(dogObj1); //打印发现出大问题了，是window对象的信息
// dogObj1.print(); //print和Name等属性是正常的加到了 window对象上了。。。
// if(dogObj1 instanceof Dog){
//     console.log("没使用new的时候");// 没有输出
// }
//
// let dogObj2 = new Dog({NameP:"dog1", ageQ:3, w:5});
// console.log(dogObj2); 
// dogObj2.print(); 
// if(dogObj2 instanceof Dog){
//     console.log("使用new的时候，正确使用");// 正常能进入if并输出
// }


// // 内置对象的一些测试
// let now = Date();
// console.log(now);//Wed Jan 08 2025 17:01:18 GMT+0800 (中国标准时间)
// let emptyArray = new Array();
// console.log(emptyArray);
// let items = new Array("a", "b", "ttt");
// console.log(items.join("-"));
// let items2 = ["y", "zz", "fish"];
// console.log(items2.join("-"));
// // create_object.js:95 Wed Jan 08 2025 17:23:41 GMT+0800 (中国标准时间)
// // create_object.js:97 []
// // create_object.js:99 a-b-ttt
// // create_object.js:101 y-zz-fish

// // 构造函数，原型属性（prototype）的测试
// console.log(Array);//ƒ Array() { [native code] }
// console.log(Array.prototype);//[at: ƒ, concat: ƒ, copyWithin: ƒ, fill: ƒ, find: ƒ, …]
// //可以Array后点字符，通过智能提示看其所包含的属性。
// function Dog(params)
// {
//     this.Name = params.NameP;
//     this.Age = params.ageQ;
//     this.Weight = params.w;
//     this.print = function(){
//         console.log("dog " + this.Name + "'s weight is " + this.Weight); 
//     }
//     //return this;
// }
// // 输出结果
// // console.log(Dog.prototype);
// // create_object.js:107 ƒ Array() { [native code] }
// // create_object.js:108 [at: ƒ, concat: ƒ, copyWithin: ƒ, fill: ƒ, find: ƒ, …]
// // create_object.js:120 {}



// // 测试下方法函数中修改原型的属性，及是否影响的是所有对象的
// function Robot(name){
//     this.name = name;
//     this.OutputInfo = function(){
//         return name + "的概况是：" + this.color;
//     }
// }
// Robot.prototype.color = "white";
// Robot.prototype.ProtoFun1 = function(){
//     Robot.prototype.color = "black";
// }
// let robj1 = new Robot("一号");
// let robj2 = new Robot("二号");
// console.log(robj1.OutputInfo());
// console.log(robj2.OutputInfo());
// console.log(robj1.name + "执行了下ProtoFun1函数");
// robj1.ProtoFun1();
// console.log(robj1.OutputInfo());
// console.log(robj2.OutputInfo());
// //输出结果：
// // create_object.js:141 一号的概况是：white
// // create_object.js:142 二号的概况是：white
// // create_object.js:143 一号执行了下ProtoFun1函数
// // create_object.js:145 一号的概况是：black
// // create_object.js:146 二号的概况是：black //也影响了 robj2 中的


// 测试有闭包在的时候对 arguments 的使用
function sum() {
    let result = 0;
    for (let i = 0; i < arguments.length; i++) {
        result += arguments[i];
    }
    let result2 = 0;
    let cfunT = function(){
        for (let i = 0; i < arguments.length; i++) {
            result += arguments[i];
        }
    }
    result2 = cfunT(1,3);
    console.log("run for cfunT:" + result2); // run for cfunT:undefined
    return result;
}
console.log(sum(1, 2, 3));  // 有上面的cfunT函数调用部分时，输出10，没有的时候输出的 6

